import type {
  SysDictionaryDataDtlVo,
  SysDictionaryDataPageQo,
  SysDictionaryDataQo,
  SysDictionaryDataVo,
} from '#/system/dict/dictionaryData'
import { http } from '@/utils/request/index'

const NAMESPACE = import.meta.env.VITE_NAMESPACE

// 使用Map缓存正在请求的字典数据Promise，防止重复请求
const dictMap = new Map<string, Promise<SysDictionaryDataVo[]>>()
// 用于控制缓存清理的定时器
let recordsTimer: number | undefined

/**
 * 根据字典内容类型获取字典内容数据
 * 技术亮点：
 * 1. Promise缓存：解决并发请求问题
 * 2. 本地存储：减少网络请求
 * 3. RAF清理：智能内存管理
 * 4. 防抖机制：优化高频调用
 * @param type 字典内容类型
 *
 * @return  SysDictionaryDataVo[]
 *
 */
export async function getByTypeDictData(type: string) {
  // 防抖处理：清除之前的清理定时器
  if (recordsTimer) {
    cancelAnimationFrame(recordsTimer)
  }

  // 优先读取本地缓存
  const storageKey = `${NAMESPACE}-dict-${type}`
  const cache = localStorage.getItem(storageKey)
  if (cache) {
    return JSON.parse(cache)
  }

  // Promise缓存逻辑
  if (!dictMap.has(type)) {
    dictMap.set(type, (async function () {
      // 发起实际网络请求
      const res = await http.request<SysDictionaryDataVo[]>('get', `/admin-api/system/sysDictionaryData/sysDictionaryDataByDictType/${type}`)

      // 缓存到本地存储
      localStorage.setItem(storageKey, JSON.stringify(res.data))
      return res.data
    })())
  }

  // 获取缓存Promise
  const res = await dictMap.get(type)

  // 设置延迟清理（使用RAF实现微延迟）
  recordsTimer = requestAnimationFrame(() => {
    // 清理内存缓存
    dictMap.delete(type)
  })
  return res
}

/**
 * 获取字典内容分页列表
 * @param params 查询参数
 * @returns 字典内容列表
 */
export function getDictDataPageListApi(params: SysDictionaryDataPageQo) {
  return http.request<PageResult<SysDictionaryDataVo>>('get', '/admin-api/system/sysDictionaryData/sysDictionaryDataPage', {
    params,
  })
}

/**
 * 获取字典内容详情
 * @param id 字典内容id
 * @returns 字典内容详情
 */
export function getDictDataDetailsApi(id?: string) {
  return http.request<SysDictionaryDataDtlVo>('get', `/admin-api/system/sysDictionaryData/sysDictionaryDataDetails/${id}`)
}

/**
 * 新增字典内容
 * @param data 字典内容信息
 * @returns 字典内容id
 */
export function createDictDataApi(data: SysDictionaryDataQo) {
  return http.request<string>('post', '/admin-api/system/sysDictionaryData/sysDictionaryDataCreate', {
    data,
  })
}

/**
 * 修改字典内容
 * @param data 字典内容信息
 * @returns 字典内容id
 */
export function updateDictDataApi(data: SysDictionaryDataQo) {
  return http.request<string>('post', '/admin-api/system/sysDictionaryData/sysDictionaryDataUpdate', {
    data,
  })
}

/**
 * 删除字典内容
 * @param idList 字典内容id列表
 * @returns 字典内容id
 */
export function deleteDictDataApi(idList: string[]) {
  return http.request<string>('post', '/admin-api/system/sysDictionaryData/sysDictionaryDataRemove', {
    params: {
      idList: idList.join(','),
    },
  })
}

/**
 * 启用字典内容
 * @param idList 字典内容id列表
 * @returns 字典内容id
 */
export function enableDictDataApi(idList: string[]) {
  return http.request<string>('post', '/admin-api/system/sysDictionaryData/sysDictionaryDataEnable', {
    params: {
      idList: idList.join(','),
    },
  })
}

/**
 * 禁用字典内容
 * @param idList 字典内容id列表
 * @returns 字典内容id
 */
export function disableDictDataApi(idList: string[]) {
  return http.request<string>('post', '/admin-api/system/sysDictionaryData/sysDictionaryDataDisable', {
    params: {
      idList: idList.join(','),
    },
  })
}
